/* Copyright (c) 2008 LepomisLab.com, Andrey Turkin
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include "NSPopUpButtonCell.h"
#include "NSKeyedUnarchiver.h"
#include "NSMenu.h"
#include "NSView.h"

IMPLEMENT_DYNAMIC_CLASS(NSPopUpButtonCell, NSActionCell)

NSPopUpButtonCell::NSPopUpButtonCell() : NSActionCell(), m_menu(NULL), m_selection(wxNOT_FOUND)
{
}

void NSPopUpButtonCell::initWithUnarchiver(NSKeyedUnarchiver *archiver)
{
	NSActionCell::initWithUnarchiver(archiver);

	m_menu = wxDynamicCast(archiver->decodeObjectForKey(wxT("NSMenu")), NSMenu);
	wxASSERT(m_menu);
	fill_items();
	if (archiver->contains(wxT("NSMenuItem")))
	{
		NSMenuItem* item = wxDynamicCast(archiver->decodeObjectForKey(wxT("NSMenuItem")), NSMenuItem);
		wxASSERT(item);
		for(size_t i = 0; i < m_menu->size(); i++)
		{
			if (item == m_menu->getObject(i))
			{
				m_selection = (int)i;
				break;
			}
		}
	}
}

void NSPopUpButtonCell::fill_items()
{
	m_items.Empty();
	for(size_t i = 0; i < m_menu->size(); i++)
	{
		NSMenuItem* item = m_menu->getObject(i);
		wxASSERT(!item->isSeparator() && item->submenu() == NULL);
		m_items.Add(item->title());
	}
}

void NSPopUpButtonCell::_setValue(const wxString& key, wxObject *value)
{
	NSActionCell::_setValue(key, value);
}

wxObject* NSPopUpButtonCell::_getValue(const wxString& key)
{
	if (key == wxT("selectedValue"))
	{
		if (m_selection == wxNOT_FOUND)
			return NULL;
		return new wxVariant(m_items[m_selection]);
	} else
		return NSActionCell::_getValue(key);
}
#if 0
class MyButtonEvt : public wxEvtHandler
{
public:
	MyButtonEvt(NSButtonCell* cell) : wxEvtHandler(), _cell(cell){}
	void OnButton(wxCommandEvent& evt)
	{
		NSUNUSED(evt);
		_cell->performClick();
	}
private:
	NSButtonCell* _cell;
};
#endif
void NSPopUpButtonCell::_allocWidget(wxWindow *parent)
{
	wxChoice *w = new wxChoice(parent, wxID_ANY);
	w->Append(m_items);
	_widget = w;
//	_widget->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MyButtonEvt::OnButton), NULL, new MyButtonEvt(this));
	controlView()->_initWidget(_widget);
}

void NSPopUpButtonCell::_releaseWidget(wxWindow *parent)
{
	NSUNUSED(parent);
	delete _widget;
}
